
//一、先抢预约的票，如果三分钟没成果，进入刷回流模式
//1.打开无障碍开关,配置弹窗样式

auto.waitFor();
var packName = ".YJ替你抢票.";
console.show()
console.setPosition(100, 150)
console.setLogSize(12);
console.setMaxLines(500);

console.setCanInput(false);
console.setTitle("." + packName , "#ff11ee00", 30);
let continueFlag = {
 continueGlobalFlag:true
}


let screenWidth = device.width;
let screenHeight = device.height;
console.log(`您的设备宽度：${screenWidth}`);
console.log(`您的设备高度：${screenHeight}`);
// 获取屏幕信息
let widthPx = device.width;    // 物理像素宽度
let heightPx = device.height;  // 物理像素高度
let density = context.getResources().getDisplayMetrics().density;

console.log("物理分辨率:", widthPx + "x" + heightPx);
console.log("屏幕密度:", density);
console.log("dp分辨率:", (widthPx/density) + "x" + (heightPx/density));

// 设置控制台大小（单位是dp）
//2.配置弹窗

var window = floaty.window(
    <vertical>
        <button id="qiangpiaoButton" text="抢票" w="40" h="40" bg="#CCFF0000" color="white" textSize="12"/>
        <button id="huiliuButton" text="回流" w="40" h="40" bg="#CCAA9900" color="white" marginTop="10" textSize="12"/>
        <button id="tingzhiButton" text="退出" w="40" h="40" bg="#AA225500" color="white" marginTop="10" textSize="12"/>
        <button id="zhifuButton" text="暂停" w="40" h="40" bg="#AAFF1100" color="white" marginTop="10" textSize="12"/>
        <button id="tiqianButton" text="提前" w="40" h="40" bg="#AAFF1100" color="white" marginTop="10" textSize="12"/>
    </vertical>
);
window.setPosition(screenWidth*0.65, 250);
window.exitOnClose();
window.qiangpiaoButton.click(()=>{
        console.log("开始抢预约票！");
        console.log("打开猫眼app中~~");
        app.launchApp("猫眼");
        console.setTitle("." + packName + '预约抢票', "#ff11ee00", 30);
        threads.start(()=>{
            mainQiangpiao()
        })
});
window.tiqianButton.click(()=>{
        console.log("开始提前抢预约票！");
        console.log("打开猫眼app中~~");
        app.launchApp("猫眼");
        console.setTitle("." + packName + '提前抢票', "#ff11ee00", 30);
        threads.start(()=>{
            mainTiqian()
        })
});
window.zhifuButton.click(()=>{
    continueFlag.continueGlobalFlag = !continueFlag.continueGlobalFlag 
    if(continueFlag.continueGlobalFlag){
        window.zhifuButton.setText("继续")
    }else{
        window.zhifuButton.setText("暂停")
    }
});
window.huiliuButton.click(()=>{
    console.log("开始抢回流票！");
    console.log("打开猫眼app中~~");
    app.launchApp("猫眼");
    console.setTitle("." + packName + '抢回流票', "#ff11ee00", 30);
    threads.start(()=>{
        mainHuiliu()
    })
});
window.tingzhiButton.click(()=>{console.log("停止！");console.log("停止！！");console.log("停止！！！");engines.stopAllAndToast();continueFlag.continueGlobalFlag=false;console.hide()});
// 空定时器保持脚本运行，防止悬浮窗被关闭
setInterval(() => { }, 1000);


//4.执行抢预约票程序
function mainQiangpiao() {
    continueFlag.continueGlobalFlag = true;
    console.log("请进入猫眼演出详情页面");
    var isEnterMaoyanDetail= text("猫眼演出详情").findOne(150000)
    if(!isEnterMaoyanDetail){
        console.error("长时间未进入猫眼演出详情页面，结束！");
        return 
    }
    console.log("检测到您进入演出详情页面！~");

    //1.判断有没有预约
    var preBook= text("已 预 约").findOne(5000)//todo。此处需要改成已预约
    //var preBook2 = className("android.view.View").text("已填写").findOne(2000)
    //var isPreBook = preBook2!=null||preBook!=null;
    if(preBook){
        console.log("您已经预约了，马上抢您预约好的票~");
    }else{
        console.error("您未预约，结束！");
        return
    }

    //2.返回输入时间减去50ms的时间戳
    let startTimestamp = getSellTime(50);
    let persons = getPersons();
    var startTime = convertToTime(startTimestamp);
    console.log("开抢时间：", startTime);

    let currentTime = new Date().getTime();
    if(currentTime-startTimestamp>24*60*60*1000){
        console.error("时间都过去这么久了，还抢个毛啊！");
        return
    }
    console.info("等待开抢中...");
    console.info("持续获取服务器的时间，请耐心等待~...");

    //3.循环大麦当前时间戳，如果大麦时间戳大于了开始时间，那么就开始了 
    var damaiTimestamp;
    while (true) {
        damaiTimestamp = getDamaiTimestamp();
        
        console.log(`服务器时间：${convertToTime(damaiTimestamp)}`)
        if (damaiTimestamp >= startTimestamp) {
            break;
        }
    }
 
    //4.准备开始抢票,点击“立即预定”按钮
    var realStartTime = damaiTimestamp;
    console.log("时间到了，我要冲了！！！！！！！！！！");
    while(true){
        var s;
        var but1 = text("立即预订").exists();
        if(but1){
            s = text("立即预订").findOne().click();
            console.log("点击了【立即预订】")
            break;
        }

        var but2 = text("立即购票").exists();
        if(but2){
            s =text("立即购票").findOne().click();
            console.log("点击了【立即购票】")
            break;
        }
        var but3= text("特惠购票").exists();
        if(but3){
            s =text("特惠购票").findOne().click();
            console.log("点击了【特惠购票】")
            break;
        }
        
    }
   text("确认").waitFor();
   text("确认").findOne().click()
    console.log("点击了【确认】按钮");
    //休息0.3秒
    sleep(300)
    //立即支付按钮一直在一直支付
    while(text("确认").exists()){
        let querenButton = text("确认").findOne(10)
        if(querenButton){
            querenButton.click()
            sleep(100)
            console.log("继续点击【确认】按钮");  
        }
    }
    //等待立即支付按钮出现
    text("立即支付").waitFor();
    if(persons.length>0){
        for(let i=0;i<persons.length;i++){
            text(persons[i]).waitFor();
            text(persons[i]).findOne().click();
        }
        sleep(20)
    }
    var c = text("立即支付").findOne().click();
    console.log("点击【立即支付】 ");  
    var t = getDamaiTimestamp() - realStartTime
    console.log("休息0.2秒,如果【立即支付】按钮还在再点击一次")
    //休息0.2秒
    sleep(200)
    //立即支付按钮一直在一直支付
    let cishu = 1
    while(text("立即支付").exists()){
        if(continueFlag.continueGlobalFlag){
            let zhifuButton = text("立即支付").findOne(10)
            if(zhifuButton){
                zhifuButton.click()
                sleep(100)
                console.log(`继续点击【立即支付】${cishu++}次`);  
            }
        }
    }
    
    console.log("已进入支付订单页面，恭喜！！！！结束时间："+convertToTime(getDamaiTimestamp()))
 
}


//5.执行抢回流票程序
function mainHuiliu() { 
    continueFlag.continueGlobalFlag = true;
    let dateFlags = ['周']
    let priceFlags = ['内场']
    console.log("请进入【选择票档】页面");
    let isEnterMaoyanpiao= text("选择票档").findOne(150000)
    if(!isEnterMaoyanpiao){
        console.error("长时间未进入【选择票档】页面，结束！");
        return 
    }
    console.log("检测到您进入【选择票档】页面！~"); 
    while(true){ 
        //判断有没有想要的票，如果没有，那就点一下
        if(!continueFlag.continueGlobalFlag){
            break;
        }
        if(text("确认支付").exists() && text("支付订单").exists()){
            console.log("==========抢票成功！============");
            console.log("已进入【支付订单】页面，恭喜！！！！结束时间："+convertToTime(getDamaiTimestamp()))
            console.log("==========回流结束！============");
            break;
        }
        if(text("立即支付").exists()){
            if(text("查看待支付订单").exists()){
                console.log("您有待支付订单，请先处理！")
                break;
            }
            var c = text("立即支付").findOne().click();
            console.log("点击【立即支付】");  
            //休息0.3秒
            sleep(300)
            //立即支付按钮一直在一直支付
            let cishu = 1
            while(text("立即支付").exists()){
                if(continueFlag.continueGlobalFlag){
                    text("立即支付").findOne().click();
                    sleep(100)
                    console.log(`继续点击【立即支付】${cishu++}次`);  
                }
                
            }
        }
        let collectedButtons = []
        //收集日期对应的按钮
        let allDateButtons = []
        dateFlags.forEach(dateFlag=>{
            var singleConditionButtons = textContains(dateFlag).find()||[]
            singleConditionButtons.forEach(function(dateBtn){ 
                allDateButtons.push(dateBtn)
                if(dateBtn.text().includes(dateFlag)&&!dateBtn.text().includes('缺货')){
                    collectedButtons.push(dateBtn)
                }
            });
        })
        if(collectedButtons.length>0){
            //点击第一个包含‘周’，并且不含'缺货'的按钮
            collectedButtons[0].click()
            //console.log(`点击了日期按钮【${collectedButtons[0].text()}】`);
            sleep(300)
            let pricebuttons = []
            //看看哪个可以点击
            priceFlags.forEach(price=>{
                var priceBtns = textContains(price).find()||[]
                priceBtns.forEach(function(priceBtn){ 
                    if(!priceBtn.text().includes('缺货')){
                        pricebuttons.push(priceBtn)
                    }
                });
            })
            if(pricebuttons.length>0){
                //点击第一个包含‘周’，并且不含'缺货'的按钮
                pricebuttons[0].click()
                console.log(`点击了价格按钮${pricebuttons[0].text()}`);
                sleep(300)
                if(text("确认").exists()){
                    let querenButton = text("确认").findOne(10)
                    if(querenButton){
                        querenButton.click()
                        console.log("点击了【确认】按钮");
                    }
                }
                let num = 1
                while(text("确认").exists()){
                    let querenButton = text("确认").findOne(10)
                    if(querenButton){
                        querenButton.click()
                        console.log(`继续点击【确认】按钮${num++}次`);  
                        sleep(1000)
                    }else{
                        console.log("确认按钮不存在了！！！！！！！！！！！！！");
                    }   
                }
            }
        }else{
            if(allDateButtons.length>0){
                //console.log(`点击了日期按钮${allDateButtons[0].text()}，用于刷新`);
                allDateButtons[0].click()
            }
        }
    }
}

//6.执行抢预约票程序
function mainTiqian() {
    
    let startTimestamp = getSellTime(1000);
    let persons = getPersons();
    //3.循环大麦当前时间戳，如果大麦时间戳大于了开始时间，那么就开始了 
    var damaiTimestamp;
    while (true) {
        damaiTimestamp = getDamaiTimestamp();
        
        console.log(`服务器时间：${convertToTime(damaiTimestamp)}`)
        if (damaiTimestamp >= startTimestamp) {
           
            var targetButton = textContains('modelStyle').findOne(1500)
            if(targetButton){
                targetButton.click()
            }
            break;
        }
    }


    
   text("确认").waitFor();
   text("确认").findOne().click()
    console.log("点击了【确认】按钮");
    //休息0.3秒
    sleep(300)
    //立即支付按钮一直在一直支付
    while(text("确认").exists()){
        let querenButton = text("确认").findOne(10)
        if(querenButton){
            querenButton.click()
            sleep(100)
            console.log("继续点击【确认】按钮");  
        }
    }
    //等待立即支付按钮出现
    text("立即支付").waitFor();
    if(persons.length>0){
        for(let i=0;i<persons.length;i++){
            text(persons[i]).waitFor();
            text(persons[i]).findOne().click();
        }
        sleep(20)
    }
    var c = text("立即支付").findOne().click();
    console.log("点击【立即支付】 ");  
    var t = getDamaiTimestamp() - realStartTime
    console.log("休息0.2秒,如果【立即支付】按钮还在再点击一次")
    //休息0.2秒
    sleep(200)
    //立即支付按钮一直在一直支付
    let cishu = 1
    while(text("立即支付").exists()){
        if(continueFlag.continueGlobalFlag){
            let zhifuButton = text("立即支付").findOne(10)
            if(zhifuButton){
                zhifuButton.click()
                sleep(100)
                console.log(`继续点击【立即支付】${cishu++}次`);  
            }
        }
        
    }
    
 
}

function getPersons(){
    var personstring = rawInput("请输入抢票人，用逗号隔开");
    if (personstring == null || personstring.trim()=='') {
        return [];
     }else{
        var persons = personstring.split(",");
        return persons;
     }
}
//获取输入的抢票时间
function getSellTime(distance){
    var inputTime = rawInput("请输入抢票时间(按照默认格式)", "09-24 11:30");
    if (inputTime == null || inputTime.trim()=='') {
        alert("请输入抢票时间!");
        return getSellTime(distance);
     }
    //在这里使用输入的时间进行后续操作
    console.log("您输入的抢票时间：" + inputTime);
    var year;
    var month;
    var day;
    var hour;
    var minute;
    var startTimestamp;

    var times = inputTime.split(" ");
    var time1 = times[0]
    var time2 = times[1]
    var monthDay= time1.split("-");
    month = monthDay[0] - 1;
    day = monthDay[1];
    var hourMinute= time2.split(":");
    hour = hourMinute[0];
    minute=  hourMinute[1];
 
    // 设置开抢时间
    year = new Date().getFullYear();
    var second = 0;
    var msecond = 0;
    startTimestamp = new Date(year, month, day, hour, minute, second, msecond).getTime();
    return startTimestamp-distance
  
}


/**
 * @param {时间戳} timestamp 
 * @returns ISO 8601 格式的北京时间
 */
function convertToTime(timestamp) {
    var date = new Date(Number(timestamp));
    var year = date.getUTCFullYear();
    var month = (date.getUTCMonth() + 1).toString().padStart(2, "0");
    var day = date.getUTCDate().toString().padStart(2, "0");
    var hours = (date.getUTCHours() + 8).toString().padStart(2, "0");
    var minutes = date.getUTCMinutes().toString().padStart(2, "0");
    var seconds = date.getUTCSeconds().toString().padStart(2, "0");
    var milliseconds = date.getUTCMilliseconds().toString().padStart(3, "0");
    var iso8601 = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${milliseconds}`;
    return iso8601;
}
 /**
 * @returns 大麦服务器时间戳
 */
function getDamaiTimestamp() {
    let t = JSON.parse(http.get("https://mtop.damai.cn/gw/mtop.common.getTimestamp/", {
        headers: {
            'Host': 'mtop.damai.cn',
            'Content-Type': 'application/json;charset=utf-8',
            'Accept': '*/*',
            'User-Agent': 'floattime/1.1.1 (iPhone; iOS 15.6; Scale/3.00)',
            'Accept-Language': 'zh-Hans-CN;q=1, en-CN;q=0.9',
            'Accept-Encoding': 'gzip, deflate, br',
            'Connection': 'keep-alive'
        }
    }).body.string()).data.t
    return t;
}

